Enforce the widget/child realization/mapping invariants.
authorOwen Taylor <otaylor@redhat.com>
Thu, 19 Jul 2001 14:57:15 +0000 (14:57 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Thu, 19 Jul 2001 14:57:15 +0000 (14:57 +0000)
Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>

* gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
the widget/child realization/mapping invariants.

* gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions
gtk_widget_[get/set]_child_visible() to control
whether visible children of a mapped window are
mapped.

* docs/widget_system.txt: Updated for changes in
container contract, and addition of GTK_CHILD_VISIBLE.

* gtk/gtkcontainer.c: Add generic map()/unmap()
functions that work for almost all containers.

* gtk/gtknotebook.c gtk/gtkpacker.c: Use
gtk_widget_set_child_visible() where necessary.

* gtk/*.c: Remove excess map(), unmap(), and
realization/mapping invariant enforcing code
from many containers.

38 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/Changes-2.0.txt
docs/reference/gtk/tmpl/gtkrc.sgml
docs/widget_system.txt
gtk/gtkbin.c
gtk/gtkbox.c
gtk/gtkcontainer.c
gtk/gtkcontainer.h
gtk/gtkfixed.c
gtk/gtkframe.c
gtk/gtkhsv.c
gtk/gtkimagemenuitem.c
gtk/gtkitem.c
gtk/gtklayout.c
gtk/gtklist.c
gtk/gtkmenu.c
gtk/gtkmenushell.c
gtk/gtknotebook.c
gtk/gtkpacker.c
gtk/gtkpaned.c
gtk/gtkplug.c
gtk/gtkprivate.h
gtk/gtkscrolledwindow.c
gtk/gtktable.c
gtk/gtktextview.c
gtk/gtktoolbar.c
gtk/gtktree.c
gtk/gtktreeitem.c
gtk/gtktreeviewcolumn.c
gtk/gtkviewport.c
gtk/gtkwidget.c
gtk/gtkwidget.h

index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index d3fe2970c2a2f2c9d93bb26ef96220b423e2bdba..589f7cc0dc21576a89f81b391c1ea40b878497b4 100644 (file)
@@ -1,7 +1,30 @@
+Sat Jul  7 02:50:14 2001  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_set_parent): Enforce
+       the widget/child realization/mapping invariants.
+
+       * gtk/gtkwidget.[ch] gtk/gtkprivate.h: Add functions 
+       gtk_widget_[get/set]_child_visible() to control
+       whether visible children of a mapped window are
+       mapped.
+
+       * docs/widget_system.txt: Updated for changes in
+       container contract, and addition of GTK_CHILD_VISIBLE.
+
+       * gtk/gtkcontainer.c: Add generic map()/unmap()
+       functions that work for almost all containers.
+
+       * gtk/gtknotebook.c gtk/gtkpacker.c: Use 
+       gtk_widget_set_child_visible() where necessary.
+
+       * gtk/*.c: Remove excess map(), unmap(), and 
+       realization/mapping invariant enforcing code
+       from many containers.
+
 Wed Jul 18 19:51:45 2001  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtktextview.c (gtk_text_view_set_attributes_from_style): 
-       Get the foreground color from 'text', nor 'base'. (#57568)
+       Get the foreground color from 'text', nor 'fg'. (#57568)
 
 Wed Jul 18 19:28:46 2001  Owen Taylor  <otaylor@redhat.com>
 
index 38fa74085228588216a990be016a3abbccfbf2f7..ffce736df0a8cff9fda66be1ed5b132106d277d9 100644 (file)
@@ -396,3 +396,33 @@ Incompatible Changes from GTK+-1.2 to GTK+-2.0:
   undefined contents for the offscreen areas. In most cases, code
   using gdk_image_get() should really be ported to
   gdk_pixbuf_get_from_drawable().
+
+* The core GTK+ now takes care of handling mapping, unmapping and
+  realizing the child widgets of containers in
+  gtk_widget_set_parent(). In most cases, this allows container
+  implementations to be simplifid by removing the code in add()
+  methods to map and realize children. However, there are 
+  a couple of things to watch out for here:
+
+   - If the parent is realized before the add() happens, 
+     gtk_widget_set_parent_window() must be called before
+     gtk_widget_set_parent(), since gtk_widget_set_parent()
+     will realize the child.
+
+   - If a container depended on its children not being mapped
+     unless it did so itself (for example, GtkNotebook only
+     mapped the current page), then the new function
+     gtk_widget_set_child_visible() must be called to keep
+     widgets that should not be mapped not mapped.
+
+  As part of this change, most containers also will no longer need
+  custom implementations of the map() and unmap() virtual
+  functions. The only cases where this is necessary are:
+
+   - For !NO_WINDOW widgets, if you create children of widget->window 
+     and don't map them in realize() then you must map them
+     in map(). [ In almost all cases, you can simply map the
+     windows in realize() ]
+
+   - For NO_WINDOW widgets, if you create windows in your realize()
+     method, you must map then in map() and unmap them in unmap().
index cc0b23b6d217a6b8beefca09d47e350a7eb6068a..30ffca8235aa804f9d0033f0f1ed9b6a61d8fd94 100644 (file)
@@ -495,7 +495,6 @@ This can later be composited together with other
 #GtkRcStyle structures to form a #GtkStyle.
 </para>
 
-@parent_instance: 
 @name: 
 @bg_pixmap_name: 
 @font_desc: 
index 1c6428af11c1e2a67e4f3d8aa517995ac18db963..26efd02acde7f94baad0f2fabb6d2c552430d15c 100644 (file)
@@ -88,6 +88,14 @@ GTK_VISIBLE:
        Set by gtk_widget_hide.
        Implies that a widget is not onscreen, therefore !GTK_MAPPED.
 
+GTK_CHILD_VISIBLE
+        Set by gtk_widget_set_child_visible, and if FALSE indicates that 
+        the widget should not be mapped even if the parent is mapped
+        and visible. Containers like GtkNotebook use this flag.
+        A private flag, not a public flag, so if you need to check
+        this flag, you should call gtk_widget_get_child_visible().
+        (Should be very rarely necesary.)
+
 GTK_SENSITIVE:
        Set and unset by gtk_widget_set_sensitive.
        The sensitivity of a widget determines whether it will receive
@@ -228,10 +236,12 @@ In the following
 5) if !GTK_WIDGET_TOPLEVEL (widget):
 
    GTK_WIDGET_MAPPED (widget) => GTK_WIDGET_VISIBLE (widget)
+                              => GTK_WIDGET_CHILD_VISIBLE (widget)
                               => GTK_WIDGET_REALIZED (widget)
 
    widget->parent && GTK_WIDGET_MAPPED (widget->parent) && 
-     GTK_WIDGET_VISIBLE (widget) => GTK_WIDGET_MAPPED (widget)
+     GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_CHILD_VISIBLE 
+       => GTK_WIDGET_MAPPED (widget)
 
 Note:, the definition
 
@@ -305,18 +315,9 @@ Adding to a container
 
 When a widget is added to a container, the container:
 
-  1) calls gtk_widget_set_parent (widget, container)
-  2) calls gtk_widget_set_parent_window (widget, window) if 
+  1) calls gtk_widget_set_parent_window (widget, window) if 
      the widget is being added to something other than container->window
-  3) if container is realized, and not widget, realizes widget
-  4) if container is mapped, and not widget and widget is GTK_VISIBLE,
-     maps widget
-  5) Queues a resize if the widget is mapped
-
-Note: It would be nice to remove 3) and 4) out of widget specific code
-  since they are of the invariant-enforcing nature, but it is
-  a bit hard, since they can't be done until after 2)
-
+  2) calls gtk_widget_set_parent (widget, container)
 
 Removing from a container
 -------------------------
@@ -369,7 +370,9 @@ The Map signal
   1) Set the MAPPED flag
   2) If the widget has any windows, gdk_window_show those windows
   3) call gtk_widget_map for all child widgets that are 
-     VISIBLE and !MAPPED.
+     VISIBLE, CHILD_VISIBLE and !MAPPED. (A widget will only
+     be !CHILD_VISIBLE if the container set it that way, so
+     most containers will not have to check this.)
   3) Do any other functions related to putting the widget onscreen.
      (for instance, showing extra popup windows...)
 
index d6a21eb9b9745682f74f5f9c653d273237ec956e..e412869b24be10c6afe63fabcba5017f525a309c 100644 (file)
@@ -29,8 +29,6 @@
 
 static void gtk_bin_class_init (GtkBinClass    *klass);
 static void gtk_bin_init       (GtkBin         *bin);
-static void gtk_bin_map        (GtkWidget      *widget);
-static void gtk_bin_unmap      (GtkWidget      *widget);
 static void gtk_bin_add        (GtkContainer   *container,
                                GtkWidget      *widget);
 static void gtk_bin_remove     (GtkContainer   *container,
@@ -83,9 +81,6 @@ gtk_bin_class_init (GtkBinClass *class)
 
   parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
 
-  widget_class->map = gtk_bin_map;
-  widget_class->unmap = gtk_bin_unmap;
-
   container_class->add = gtk_bin_add;
   container_class->remove = gtk_bin_remove;
   container_class->forall = gtk_bin_forall;
@@ -110,42 +105,6 @@ gtk_bin_child_type (GtkContainer *container)
     return GTK_TYPE_NONE;
 }
 
-static void
-gtk_bin_map (GtkWidget *widget)
-{
-  GtkBin *bin;
-
-  g_return_if_fail (GTK_IS_BIN (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  bin = GTK_BIN (widget);
-
-  if (bin->child &&
-      GTK_WIDGET_VISIBLE (bin->child) &&
-      !GTK_WIDGET_MAPPED (bin->child))
-    gtk_widget_map (bin->child);
-
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_show (widget->window);
-}
-
-static void
-gtk_bin_unmap (GtkWidget *widget)
-{
-  GtkBin *bin;
-
-  g_return_if_fail (GTK_IS_BIN (widget));
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-  bin = GTK_BIN (widget);
-
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_hide (widget->window);
-
-  if (bin->child && GTK_WIDGET_MAPPED (bin->child))
-    gtk_widget_unmap (bin->child);
-}
-
 static void
 gtk_bin_add (GtkContainer *container,
             GtkWidget    *child)
@@ -171,17 +130,6 @@ gtk_bin_add (GtkContainer *container,
 
   gtk_widget_set_parent (child, GTK_WIDGET (bin));
   bin->child = child;
-
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 static void
index b161bce0e5a66a43038b08949cc486b09a3ca1c2..ad309dfa502ee0db2155f7bab146b4169b8c08b3 100644 (file)
@@ -52,8 +52,6 @@ static void gtk_box_get_property (GObject         *object,
                                  guint            prop_id,
                                  GValue          *value,
                                  GParamSpec      *pspec);
-static void gtk_box_map        (GtkWidget      *widget);
-static void gtk_box_unmap      (GtkWidget      *widget);
 static void gtk_box_add        (GtkContainer   *container,
                                GtkWidget      *widget);
 static void gtk_box_remove     (GtkContainer   *container,
@@ -115,9 +113,6 @@ gtk_box_class_init (GtkBoxClass *class)
   gobject_class->set_property = gtk_box_set_property;
   gobject_class->get_property = gtk_box_get_property;
    
-  widget_class->map = gtk_box_map;
-  widget_class->unmap = gtk_box_unmap;
-
   container_class->add = gtk_box_add;
   container_class->remove = gtk_box_remove;
   container_class->forall = gtk_box_forall;
@@ -378,16 +373,6 @@ gtk_box_pack_start (GtkBox    *box,
 
   gtk_widget_set_parent (child, GTK_WIDGET (box));
   
-  if (GTK_WIDGET_REALIZED (box))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (box) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (box))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
   gtk_widget_child_notify (child, "expand");
   gtk_widget_child_notify (child, "fill");
   gtk_widget_child_notify (child, "padding");
@@ -423,16 +408,6 @@ gtk_box_pack_end (GtkBox    *box,
 
   gtk_widget_set_parent (child, GTK_WIDGET (box));
 
-  if (GTK_WIDGET_REALIZED (box))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (box) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (box))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
   gtk_widget_child_notify (child, "expand");
   gtk_widget_child_notify (child, "fill");
   gtk_widget_child_notify (child, "padding");
@@ -667,54 +642,6 @@ gtk_box_set_child_packing (GtkBox               *box,
   gtk_widget_thaw_child_notify (child);
 }
 
-static void
-gtk_box_map (GtkWidget *widget)
-{
-  GtkBox *box;
-  GtkBoxChild *child;
-  GList *children;
-
-  g_return_if_fail (GTK_IS_BOX (widget));
-
-  box = GTK_BOX (widget);
-  GTK_WIDGET_SET_FLAGS (box, GTK_MAPPED);
-
-  children = box->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-}
-
-static void
-gtk_box_unmap (GtkWidget *widget)
-{
-  GtkBox *box;
-  GtkBoxChild *child;
-  GList *children;
-
-  g_return_if_fail (GTK_IS_BOX (widget));
-
-  box = GTK_BOX (widget);
-  GTK_WIDGET_UNSET_FLAGS (box, GTK_MAPPED);
-
-  children = box->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_unmap (child->widget);
-    }
-}
-
 static void
 gtk_box_add (GtkContainer *container,
             GtkWidget    *widget)
index 0baef911746368442a8f871595eb9ad657a73384..90d637bfe9610510076039e75a74ddad3d9c0fc0 100644 (file)
@@ -98,6 +98,9 @@ static void     gtk_container_show_all             (GtkWidget         *widget);
 static void     gtk_container_hide_all             (GtkWidget         *widget);
 static gint     gtk_container_expose               (GtkWidget         *widget,
                                                    GdkEventExpose    *event);
+static void     gtk_container_map                  (GtkWidget         *widget);
+static void     gtk_container_unmap                (GtkWidget         *widget);
+
 static gchar* gtk_container_child_default_composite_name (GtkContainer *container,
                                                          GtkWidget    *child);
 
@@ -186,6 +189,8 @@ gtk_container_class_init (GtkContainerClass *class)
   widget_class->show_all = gtk_container_show_all;
   widget_class->hide_all = gtk_container_hide_all;
   widget_class->expose_event = gtk_container_expose;
+  widget_class->map = gtk_container_map;
+  widget_class->unmap = gtk_container_unmap;
   widget_class->focus = gtk_container_focus;
   
   class->add = gtk_container_add_unimplemented;
@@ -2314,6 +2319,41 @@ gtk_container_expose (GtkWidget      *widget,
   return TRUE;
 }
 
+static void
+gtk_container_map_child (GtkWidget *child,
+                        gpointer   client_data)
+{
+  if (GTK_WIDGET_VISIBLE (child) &&
+      GTK_WIDGET_CHILD_VISIBLE (child) &&
+      !GTK_WIDGET_MAPPED (child))
+    gtk_widget_map (child);
+}
+
+static void
+gtk_container_map (GtkWidget *widget)
+{
+  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
+
+  gtk_container_forall (GTK_CONTAINER (widget),
+                       gtk_container_map_child,
+                       NULL);
+
+  if (!GTK_WIDGET_NO_WINDOW (widget))
+    gdk_window_show (widget->window);
+}
+
+static void
+gtk_container_unmap (GtkWidget *widget)
+{
+  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
+
+  if (!GTK_WIDGET_NO_WINDOW (widget))
+    gdk_window_hide (widget->window);
+  else
+    gtk_container_forall (GTK_CONTAINER (widget),
+                         (GtkCallback)gtk_widget_unmap,
+                         NULL);
+}
 
 /**
  * gtk_container_propagate_expose:
index cebb10b8268e335847ec5619da0c9cf68643a87e..34f0b07f83dbae20a8d7fb40913041a259cf7e8d 100644 (file)
@@ -191,7 +191,6 @@ void             gtk_container_child_get_property           (GtkContainer      *container,
                                                         GtkWidget         *child,
                                                         const gchar       *property_name,
                                                         GValue            *value);
-     
 
 #define GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(object, property_id, pspec) \
     G_OBJECT_WARN_INVALID_PSPEC ((object), "child property id", (property_id), (pspec))
index 84aaf639687183e831a8fd580ea94e6c2b54b059..3b214886a8fb40be6cb17e0cdd56ed68b8c6b3e8 100644 (file)
@@ -29,7 +29,6 @@
 
 static void gtk_fixed_class_init    (GtkFixedClass    *klass);
 static void gtk_fixed_init          (GtkFixed         *fixed);
-static void gtk_fixed_map           (GtkWidget        *widget);
 static void gtk_fixed_realize       (GtkWidget        *widget);
 static void gtk_fixed_size_request  (GtkWidget        *widget,
                                     GtkRequisition   *requisition);
@@ -87,7 +86,6 @@ gtk_fixed_class_init (GtkFixedClass *class)
 
   parent_class = gtk_type_class (GTK_TYPE_CONTAINER);
 
-  widget_class->map = gtk_fixed_map;
   widget_class->realize = gtk_fixed_realize;
   widget_class->size_request = gtk_fixed_size_request;
   widget_class->size_allocate = gtk_fixed_size_allocate;
@@ -140,17 +138,6 @@ gtk_fixed_put (GtkFixed       *fixed,
   gtk_widget_set_parent (widget, GTK_WIDGET (fixed));
 
   fixed->children = g_list_append (fixed->children, child_info); 
-
-  if (GTK_WIDGET_REALIZED (fixed))
-    gtk_widget_realize (widget);
-
-  if (GTK_WIDGET_VISIBLE (fixed) && GTK_WIDGET_VISIBLE (widget))
-    {
-      if (GTK_WIDGET_MAPPED (fixed))
-       gtk_widget_map (widget);
-      
-      gtk_widget_queue_resize (GTK_WIDGET (fixed));
-    }
 }
 
 void
@@ -184,32 +171,6 @@ gtk_fixed_move (GtkFixed       *fixed,
     }
 }
 
-static void
-gtk_fixed_map (GtkWidget *widget)
-{
-  GtkFixed *fixed;
-  GtkFixedChild *child;
-  GList *children;
-
-  g_return_if_fail (GTK_IS_FIXED (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  fixed = GTK_FIXED (widget);
-
-  children = fixed->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-
-  gdk_window_show (widget->window);
-}
-
 static void
 gtk_fixed_realize (GtkWidget *widget)
 {
index 26f24b5779a75adeb0f810c3a0ce6640384170c6..98dfc509a6a759ab58e68b1cb614676baf0d1d89 100644 (file)
@@ -60,8 +60,6 @@ static void gtk_frame_size_request  (GtkWidget      *widget,
                                     GtkRequisition *requisition);
 static void gtk_frame_size_allocate (GtkWidget      *widget,
                                     GtkAllocation  *allocation);
-static void gtk_frame_map           (GtkWidget      *widget);
-static void gtk_frame_unmap         (GtkWidget      *widget);
 static void gtk_frame_remove        (GtkContainer   *container,
                                     GtkWidget      *child);
 static void gtk_frame_forall        (GtkContainer   *container,
@@ -168,8 +166,6 @@ gtk_frame_class_init (GtkFrameClass *class)
   widget_class->expose_event = gtk_frame_expose;
   widget_class->size_request = gtk_frame_size_request;
   widget_class->size_allocate = gtk_frame_size_allocate;
-  widget_class->map = gtk_frame_map;
-  widget_class->unmap = gtk_frame_unmap;
 
   container_class->remove = gtk_frame_remove;
   container_class->forall = gtk_frame_forall;
@@ -638,32 +634,6 @@ gtk_frame_size_allocate (GtkWidget     *widget,
     }
 }
 
-static void
-gtk_frame_map (GtkWidget *widget)
-{
-  GtkFrame *frame = GTK_FRAME (widget);
-  
-  if (frame->label_widget &&
-      GTK_WIDGET_VISIBLE (frame->label_widget) &&
-      !GTK_WIDGET_MAPPED (frame->label_widget))
-    gtk_widget_map (frame->label_widget);
-
-  if (GTK_WIDGET_CLASS (parent_class)->map)
-    (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
-}
-
-static void
-gtk_frame_unmap (GtkWidget *widget)
-{
-  GtkFrame *frame = GTK_FRAME (widget);
-
-  if (GTK_WIDGET_CLASS (parent_class)->unmap)
-    (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
-
-  if (frame->label_widget && GTK_WIDGET_MAPPED (frame->label_widget))
-    gtk_widget_unmap (frame->label_widget);
-}
-
 static void
 gtk_frame_compute_child_allocation (GtkFrame      *frame,
                                    GtkAllocation *child_allocation)
index 496f7558a4e7a30185bfe618a4d0cc6e4b824e45..a7e5ae6fd7d094c77114fa421687fc9e28453f8d 100644 (file)
@@ -87,8 +87,6 @@ enum {
 static void gtk_hsv_class_init     (GtkHSVClass    *class);
 static void gtk_hsv_init           (GtkHSV         *hsv);
 static void gtk_hsv_destroy        (GtkObject      *object);
-static void gtk_hsv_map            (GtkWidget      *widget);
-static void gtk_hsv_unmap          (GtkWidget      *widget);
 static void gtk_hsv_realize        (GtkWidget      *widget);
 static void gtk_hsv_unrealize      (GtkWidget      *widget);
 static void gtk_hsv_size_request   (GtkWidget      *widget,
@@ -162,8 +160,6 @@ gtk_hsv_class_init (GtkHSVClass *class)
   
   object_class->destroy = gtk_hsv_destroy;
   
-  widget_class->map = gtk_hsv_map;
-  widget_class->unmap = gtk_hsv_unmap;
   widget_class->realize = gtk_hsv_realize;
   widget_class->unrealize = gtk_hsv_unrealize;
   widget_class->size_request = gtk_hsv_size_request;
@@ -265,42 +261,6 @@ gtk_hsv_destroy (GtkObject *object)
 
 /* Default signal handlers */
 
-/* Map handler for the HSV color selector */
-static void
-gtk_hsv_map (GtkWidget *widget)
-{
-  GtkHSV *hsv;
-  HSVPrivate *priv;
-  
-  hsv = GTK_HSV (widget);
-  priv = hsv->priv;
-  
-  if (GTK_WIDGET_MAPPED (widget))
-    return;
-  
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  
-  gdk_window_show (priv->window);
-}
-
-/* Unmap handler for the HSV color selector */
-static void
-gtk_hsv_unmap (GtkWidget *widget)
-{
-  GtkHSV *hsv;
-  HSVPrivate *priv;
-  
-  hsv = GTK_HSV (widget);
-  priv = hsv->priv;
-  
-  if (!GTK_WIDGET_MAPPED (widget))
-    return;
-  
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-  
-  gdk_window_hide (priv->window);
-}
-
 /* Realize handler for the HSV color selector */
 static void
 gtk_hsv_realize (GtkWidget *widget)
index 8fcca1dabdb51a8a35878325fd60da44eeae6349..277937eba2ad03556b75df2f96226fd9fa922def 100644 (file)
@@ -43,8 +43,6 @@ static void gtk_image_menu_item_remove               (GtkContainer          *con
 static void gtk_image_menu_item_toggle_size_request  (GtkMenuItem           *menu_item,
                                                      gint                  *requisition);
 
-static void gtk_image_menu_item_map        (GtkWidget      *widget);
-static void gtk_image_menu_item_unmap      (GtkWidget      *widget);
 static void gtk_image_menu_item_forall     (GtkContainer   *container,
                                             gboolean       include_internals,
                                             GtkCallback     callback,
@@ -111,8 +109,6 @@ gtk_image_menu_item_class_init (GtkImageMenuItemClass *klass)
   
   widget_class->size_request = gtk_image_menu_item_size_request;
   widget_class->size_allocate = gtk_image_menu_item_size_allocate;
-  widget_class->map = gtk_image_menu_item_map;
-  widget_class->unmap = gtk_image_menu_item_unmap;
 
   container_class->forall = gtk_image_menu_item_forall;
   container_class->remove = gtk_image_menu_item_remove;
@@ -267,44 +263,6 @@ gtk_image_menu_item_size_allocate (GtkWidget     *widget,
     }
 }
 
-static void
-gtk_image_menu_item_map (GtkWidget *widget)
-{
-  GtkImageMenuItem *image_menu_item;
-
-  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (widget));
-
-  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
-  
-  (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
-
-  if (image_menu_item->image &&
-      GTK_WIDGET_VISIBLE (image_menu_item->image) &&
-      !GTK_WIDGET_MAPPED (image_menu_item->image))
-    gtk_widget_map (image_menu_item->image);
-
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_show (widget->window);  
-}
-
-static void
-gtk_image_menu_item_unmap (GtkWidget *widget)
-{
-  GtkImageMenuItem *image_menu_item;
-
-  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (widget));
-
-  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
-  
-  (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
-  
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_hide (widget->window);
-  
-  if (image_menu_item->image && GTK_WIDGET_MAPPED (image_menu_item->image))
-    gtk_widget_unmap (image_menu_item->image);  
-}
-
 static void
 gtk_image_menu_item_forall (GtkContainer   *container,
                             gboolean       include_internals,
@@ -442,17 +400,6 @@ gtk_image_menu_item_set_image (GtkImageMenuItem *image_menu_item,
   gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item));
 
   g_object_notify (G_OBJECT (image_menu_item), "image");
-  
-  if (GTK_WIDGET_REALIZED (image->parent))
-    gtk_widget_realize (image);
-  
-  if (GTK_WIDGET_VISIBLE (image->parent) && GTK_WIDGET_VISIBLE (image))
-    {
-      if (GTK_WIDGET_MAPPED (image->parent))
-       gtk_widget_map (image);
-
-      gtk_widget_queue_resize (image);
-    }
 }
 
 GtkWidget*
index 76b38d9eba83fcfa21a2cf7f29db94e8e69cca23..839928cc224df9dcd4e099fbbaeaf3f646c306d5 100644 (file)
@@ -38,8 +38,6 @@ enum {
 
 static void gtk_item_class_init (GtkItemClass     *klass);
 static void gtk_item_init       (GtkItem          *item);
-static void gtk_item_map        (GtkWidget        *widget);
-static void gtk_item_unmap      (GtkWidget        *widget);
 static void gtk_item_realize    (GtkWidget        *widget);
 static gint gtk_item_enter      (GtkWidget        *widget,
                                 GdkEventCrossing *event);
@@ -85,8 +83,6 @@ gtk_item_class_init (GtkItemClass *class)
   widget_class = (GtkWidgetClass*) class;
 
 
-  widget_class->map = gtk_item_map;
-  widget_class->unmap = gtk_item_unmap;
   widget_class->realize = gtk_item_realize;
   widget_class->enter_notify_event = gtk_item_enter;
   widget_class->leave_notify_event = gtk_item_leave;
@@ -144,35 +140,6 @@ gtk_item_toggle (GtkItem *item)
 }
 
 
-static void
-gtk_item_map (GtkWidget *widget)
-{
-  GtkBin *bin;
-
-  g_return_if_fail (GTK_IS_ITEM (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-
-  bin = GTK_BIN (widget);
-
-  if (bin->child &&
-      GTK_WIDGET_VISIBLE (bin->child) &&
-      !GTK_WIDGET_MAPPED (bin->child))
-    gtk_widget_map (bin->child);
-
-  gdk_window_show (widget->window);
-}
-
-static void
-gtk_item_unmap (GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_ITEM (widget));
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-
-  gdk_window_hide (widget->window);
-}
-
 static void
 gtk_item_realize (GtkWidget *widget)
 {
index ec1ffc55791833ca626488f92d3e5fb621647d0c..c50290509a91dd44a386a5b7bedc0195946cfda5 100644 (file)
@@ -233,20 +233,10 @@ gtk_layout_put (GtkLayout     *layout,
 
   layout->children = g_list_append (layout->children, child);
   
-  gtk_widget_set_parent (child_widget, GTK_WIDGET (layout));
   if (GTK_WIDGET_REALIZED (layout))
     gtk_widget_set_parent_window (child->widget, layout->bin_window);
-
-  if (GTK_WIDGET_REALIZED (layout))
-    gtk_widget_realize (child_widget);
-    
-  if (GTK_WIDGET_VISIBLE (layout) && GTK_WIDGET_VISIBLE (child_widget))
-    {
-      if (GTK_WIDGET_MAPPED (layout))
-       gtk_widget_map (child_widget);
-
-      gtk_widget_queue_resize (child_widget);
-    }
+  
+  gtk_widget_set_parent (child_widget, GTK_WIDGET (layout));
 }
 
 void           
index 79e42b5a22e344f7b35695e9df601c0fb126a5e3..ba080fc6c8ba60450c4e0f1e2a8229ec97fe7cb6 100644 (file)
@@ -64,7 +64,6 @@ static void gtk_list_size_request    (GtkWidget            *widget,
 static void gtk_list_size_allocate   (GtkWidget             *widget,
                                      GtkAllocation  *allocation);
 static void gtk_list_realize        (GtkWidget      *widget);
-static void gtk_list_map            (GtkWidget      *widget);
 static void gtk_list_unmap          (GtkWidget      *widget);
 static void gtk_list_style_set      (GtkWidget      *widget,
                                      GtkStyle       *previous_style);
@@ -219,7 +218,6 @@ gtk_list_class_init (GtkListClass *class)
   object_class->set_arg = gtk_list_set_arg;
   object_class->get_arg = gtk_list_get_arg;
 
-  widget_class->map = gtk_list_map;
   widget_class->unmap = gtk_list_unmap;
   widget_class->style_set = gtk_list_style_set;
   widget_class->realize = gtk_list_realize;
@@ -352,7 +350,6 @@ gtk_list_dispose (GObject *object)
  * gtk_list_size_request
  * gtk_list_size_allocate
  * gtk_list_realize
- * gtk_list_map
  * gtk_list_unmap
  * gtk_list_motion_notify
  * gtk_list_button_press
@@ -478,32 +475,6 @@ gtk_list_realize (GtkWidget *widget)
                             &widget->style->base[GTK_STATE_NORMAL]);
 }
 
-static void
-gtk_list_map (GtkWidget *widget)
-{
-  GtkList *list;
-  GtkWidget *child;
-  GList *children;
-
-  g_return_if_fail (GTK_IS_LIST (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  list = GTK_LIST (widget);
-
-  children = list->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-
-      if (GTK_WIDGET_VISIBLE (child) &&
-         !GTK_WIDGET_MAPPED (child))
-       gtk_widget_map (child);
-    }
-
-  gdk_window_show (widget->window);
-}
-
 static void
 gtk_list_unmap (GtkWidget *widget)
 {
@@ -1077,17 +1048,6 @@ gtk_list_insert_items (GtkList *list,
       gtk_signal_connect (GTK_OBJECT (widget), "toggle",
                          GTK_SIGNAL_FUNC (gtk_list_signal_item_toggle),
                          list);
-
-      if (GTK_WIDGET_REALIZED (widget->parent))
-       gtk_widget_realize (widget);
-
-      if (GTK_WIDGET_VISIBLE (widget->parent) && GTK_WIDGET_VISIBLE (widget))
-       {
-         if (GTK_WIDGET_MAPPED (widget->parent))
-           gtk_widget_map (widget);
-
-         gtk_widget_queue_resize (widget);
-       }
     }
 
 
index d72d9d7ae0fdfc507024fb06d3702aecdb58466a..39786006113ff1fca31a4d14e711744db8ee2058 100644 (file)
@@ -452,9 +452,10 @@ gtk_menu_insert (GtkMenuShell     *menu_shell,
                 GtkWidget        *child,
                 gint              position)
 {
-  GTK_MENU_SHELL_CLASS (parent_class)->insert (menu_shell, child, position);
+  if (GTK_WIDGET_REALIZED (menu_shell))
+    gtk_widget_set_parent_window (child, GTK_MENU (menu_shell)->bin_window);
   
-  gtk_widget_set_parent_window (child, GTK_MENU (menu_shell)->bin_window);
+  GTK_MENU_SHELL_CLASS (parent_class)->insert (menu_shell, child, position);
 }
 
 static void
index 1e1d802ced9896a05b040e5830df2366b25564b0..a3e0d05876c0bfb8f9a65a9661501774544a1f16 100644 (file)
@@ -109,7 +109,6 @@ typedef void (*GtkMenuShellSignal2) (GtkObject *object,
 
 static void gtk_menu_shell_class_init        (GtkMenuShellClass *klass);
 static void gtk_menu_shell_init              (GtkMenuShell      *menu_shell);
-static void gtk_menu_shell_map               (GtkWidget         *widget);
 static void gtk_menu_shell_realize           (GtkWidget         *widget);
 static gint gtk_menu_shell_button_press      (GtkWidget         *widget,
                                              GdkEventButton    *event);
@@ -192,7 +191,6 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
 
   parent_class = gtk_type_class (gtk_container_get_type ());
 
-  widget_class->map = gtk_menu_shell_map;
   widget_class->realize = gtk_menu_shell_realize;
   widget_class->button_press_event = gtk_menu_shell_button_press;
   widget_class->button_release_event = gtk_menu_shell_button_release;
@@ -337,17 +335,6 @@ gtk_menu_shell_real_insert (GtkMenuShell *menu_shell,
   menu_shell->children = g_list_insert (menu_shell->children, child, position);
 
   gtk_widget_set_parent (child, GTK_WIDGET (menu_shell));
-
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 void
@@ -358,31 +345,6 @@ gtk_menu_shell_deactivate (GtkMenuShell *menu_shell)
   gtk_signal_emit (GTK_OBJECT (menu_shell), menu_shell_signals[DEACTIVATE]);
 }
 
-static void
-gtk_menu_shell_map (GtkWidget *widget)
-{
-  GtkMenuShell *menu_shell;
-  GtkWidget *child;
-  GList *children;
-
-  g_return_if_fail (GTK_IS_MENU_SHELL (widget));
-
-  menu_shell = GTK_MENU_SHELL (widget);
-  GTK_WIDGET_SET_FLAGS (menu_shell, GTK_MAPPED);
-
-  children = menu_shell->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-
-      if (GTK_WIDGET_VISIBLE (child) && !GTK_WIDGET_MAPPED (child))
-       gtk_widget_map (child);
-    }
-
-  gdk_window_show (widget->window);
-}
-
 static void
 gtk_menu_shell_realize (GtkWidget *widget)
 {
index bf7c42f87aca5d7c2ca3a1be4e24442d8d5da2c1..60569591398f60f0cfbd7658dd0d9ca756449a95 100644 (file)
@@ -154,8 +154,6 @@ static gint gtk_notebook_motion_notify       (GtkWidget        *widget,
 static gint gtk_notebook_focus_in            (GtkWidget        *widget,
                                              GdkEventFocus    *event);
 static void gtk_notebook_draw_focus          (GtkWidget        *widget);
-static void gtk_notebook_style_set           (GtkWidget        *widget,
-                                             GtkStyle         *previous_style);
 static gint gtk_notebook_focus               (GtkWidget        *widget,
                                              GtkDirectionType  direction);
 
@@ -306,7 +304,6 @@ gtk_notebook_class_init (GtkNotebookClass *class)
   widget_class->leave_notify_event = gtk_notebook_leave_notify;
   widget_class->motion_notify_event = gtk_notebook_motion_notify;
   widget_class->focus_in_event = gtk_notebook_focus_in;
-  widget_class->style_set = gtk_notebook_style_set;
   widget_class->focus = gtk_notebook_focus;
   
   container_class->add = gtk_notebook_add;
@@ -840,8 +837,6 @@ gtk_notebook_size_request (GtkWidget      *widget,
          widget->requisition.height = MAX (widget->requisition.height,
                                            child_requisition.height);
 
-         if (GTK_WIDGET_MAPPED (page->child) && page != notebook->cur_page)
-           gtk_widget_unmap (page->child);
          if (notebook->menu && page->menu_label->parent &&
              !GTK_WIDGET_VISIBLE (page->menu_label->parent))
            gtk_widget_show (page->menu_label->parent);
@@ -1447,21 +1442,6 @@ gtk_notebook_draw_focus (GtkWidget *widget)
     }
 }
 
-static void
-gtk_notebook_style_set (GtkWidget *widget,
-                       GtkStyle  *previous_style)
-{
-  if (GTK_WIDGET_REALIZED (widget) &&
-      !GTK_WIDGET_NO_WINDOW (widget))
-    {
-      gtk_style_set_background (widget->style, widget->window, widget->state);
-      if (GTK_WIDGET_DRAWABLE (widget))
-       gdk_window_clear (widget->window);
-    }
-
-  gtk_notebook_set_shape (GTK_NOTEBOOK(widget));
-}
-
 /* Private GtkContainer Methods :
  * 
  * gtk_notebook_set_child_arg
@@ -2663,7 +2643,7 @@ gtk_notebook_set_shape (GtkNotebook *notebook)
       while (children)
        {
          page = children->data;
-         if (GTK_WIDGET_MAPPED (page->tab_label))
+         if (gtk_widget_get_child_visible (page->tab_label))
            {
              x = page->allocation.x;
              y = page->allocation.y;
@@ -2922,16 +2902,16 @@ gtk_notebook_pages_allocate (GtkNotebook   *notebook)
                                                    STEP_NEXT, TRUE))
            {
              page = children->data;
-             if (page->tab_label && GTK_WIDGET_MAPPED (page->tab_label))
-               gtk_widget_unmap (page->tab_label);
+             if (page->tab_label)
+               gtk_widget_set_child_visible (page->tab_label, FALSE);
            }
          for (children = last_child; children;
               children = gtk_notebook_search_page (notebook, children,
                                                    STEP_NEXT, TRUE))
            {
              page = children->data;
-             if (page->tab_label && GTK_WIDGET_MAPPED (page->tab_label))
-               gtk_widget_unmap (page->tab_label);
+             if (page->tab_label)
+               gtk_widget_set_child_visible (page->tab_label, FALSE);
            }
        }
       else /* !showarrow */
@@ -3045,14 +3025,8 @@ gtk_notebook_pages_allocate (GtkNotebook   *notebook)
          break;
        }
 
-      if (GTK_WIDGET_REALIZED (notebook) &&
-         page->tab_label && !GTK_WIDGET_MAPPED (page->tab_label))
-       {
-         if (GTK_WIDGET_VISIBLE (page->tab_label))
-           gtk_widget_map (page->tab_label);
-         else
-           gtk_widget_show (page->tab_label);
-       }
+      if (page->tab_label)
+       gtk_widget_set_child_visible (page->tab_label, TRUE);
     }
 
   if (children)
@@ -3118,14 +3092,8 @@ gtk_notebook_pages_allocate (GtkNotebook   *notebook)
              break;
            }
 
-         if (GTK_WIDGET_REALIZED (notebook) && page->tab_label &&
-             !GTK_WIDGET_MAPPED (page->tab_label))
-           {
-             if (GTK_WIDGET_VISIBLE (page->tab_label))
-               gtk_widget_map (page->tab_label);
-             else
-               gtk_widget_show (page->tab_label);
-           }
+         if (page->tab_label)
+           gtk_widget_set_child_visible (page->tab_label, TRUE);
        }
     }
 
@@ -3383,8 +3351,8 @@ gtk_notebook_real_switch_page (GtkNotebook     *notebook,
   if (notebook->cur_page == page || !GTK_WIDGET_VISIBLE (page->child))
     return;
 
-  if (notebook->cur_page && GTK_WIDGET_MAPPED (notebook->cur_page->child))
-    gtk_widget_unmap (notebook->cur_page->child);
+  if (notebook->cur_page)
+    gtk_widget_set_child_visible (notebook->cur_page->child, FALSE);
   
   notebook->cur_page = page;
 
@@ -3393,8 +3361,7 @@ gtk_notebook_real_switch_page (GtkNotebook     *notebook,
     notebook->focus_tab = 
       g_list_find (notebook->children, notebook->cur_page);
 
-  if (GTK_WIDGET_MAPPED (notebook))
-    gtk_widget_map (notebook->cur_page->child);
+  gtk_widget_set_child_visible (notebook->cur_page->child, TRUE);
 
   gtk_widget_queue_resize (GTK_WIDGET (notebook));
   g_object_notify (G_OBJECT (notebook), "page");
@@ -3834,6 +3801,19 @@ gtk_notebook_insert_page_menu (GtkNotebook *notebook,
   if (!notebook->first_tab)
     notebook->first_tab = notebook->children;
 
+  if (!notebook->cur_page)
+    gtk_widget_set_child_visible (child, TRUE);
+  else
+    gtk_widget_set_child_visible (child, FALSE);
+  
+  if (tab_label)
+    {
+      if (notebook->show_tabs && GTK_WIDGET_VISIBLE (child))
+       gtk_widget_show (tab_label);
+      else
+       gtk_widget_hide (tab_label);
+    }
+
   gtk_widget_set_parent (child, GTK_WIDGET (notebook));
   if (tab_label)
     gtk_widget_set_parent (tab_label, GTK_WIDGET (notebook));
@@ -3844,41 +3824,6 @@ gtk_notebook_insert_page_menu (GtkNotebook *notebook,
       gtk_notebook_switch_focus_tab (notebook, NULL);
     }
 
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (notebook))
-    {
-      if (GTK_WIDGET_VISIBLE (child))
-       {
-         if (GTK_WIDGET_MAPPED (notebook) &&
-             !GTK_WIDGET_MAPPED (child) &&
-             notebook->cur_page == page)
-           gtk_widget_map (child);
-         
-         gtk_widget_queue_resize (child);
-       }
-
-      if (tab_label)
-       {
-         if (notebook->show_tabs && GTK_WIDGET_VISIBLE (child))
-           {
-             if (!GTK_WIDGET_VISIBLE (tab_label))
-               gtk_widget_show (tab_label);
-             
-             if (GTK_WIDGET_REALIZED (notebook) &&
-                 !GTK_WIDGET_REALIZED (tab_label))
-               gtk_widget_realize (tab_label);
-             
-             if (GTK_WIDGET_MAPPED (notebook) &&
-                 !GTK_WIDGET_MAPPED (tab_label))
-               gtk_widget_map (tab_label);
-           }
-         else if (GTK_WIDGET_VISIBLE (tab_label))
-           gtk_widget_hide (tab_label);
-       }
-    }
-
   if (tab_label)
     page->mnemonic_activate_signal =
       gtk_signal_connect (GTK_OBJECT (tab_label),
index 8d71e49f21efd785c25de5dd966002d16b93af78..9a5a54afe330216143c668d41718480235a1ec8e 100644 (file)
@@ -125,8 +125,6 @@ enum {
 
 static void gtk_packer_class_init    (GtkPackerClass   *klass);
 static void gtk_packer_init          (GtkPacker        *packer);
-static void gtk_packer_map           (GtkWidget        *widget);
-static void gtk_packer_unmap         (GtkWidget        *widget);
 static void gtk_packer_size_request  (GtkWidget      *widget,
                                       GtkRequisition *requisition);
 static void gtk_packer_size_allocate (GtkWidget      *widget,
@@ -215,9 +213,6 @@ gtk_packer_class_init (GtkPackerClass *klass)
   gobject_class->set_property = gtk_packer_set_property;
   gobject_class->get_property = gtk_packer_get_property;
 
-  widget_class->map = gtk_packer_map;
-  widget_class->unmap = gtk_packer_unmap;
-  
   widget_class->size_request = gtk_packer_size_request;
   widget_class->size_allocate = gtk_packer_size_allocate;
   
@@ -697,17 +692,6 @@ gtk_packer_add_defaults (GtkPacker       *packer,
   packer->children = g_list_append(packer->children, (gpointer) pchild);
   
   gtk_widget_set_parent (child, GTK_WIDGET (packer));
-  
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 void 
@@ -745,17 +729,6 @@ gtk_packer_add (GtkPacker       *packer,
   packer->children = g_list_append(packer->children, (gpointer) pchild);
   
   gtk_widget_set_parent (child, GTK_WIDGET (packer));
-  
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 void
@@ -904,54 +877,6 @@ gtk_packer_remove (GtkContainer *container,
     }
 }
 
-static void 
-gtk_packer_map (GtkWidget *widget)
-{
-  GtkPacker *packer;
-  GtkPackerChild *child;
-  GList *children;
-  
-  g_return_if_fail (GTK_IS_PACKER (widget));
-  
-  packer = GTK_PACKER (widget);
-  GTK_WIDGET_SET_FLAGS (packer, GTK_MAPPED);
-  
-  children = g_list_first(packer->children);
-  while (children != NULL) 
-    {
-      child = children->data;
-      children = g_list_next(children);
-      
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-}
-
-static void 
-gtk_packer_unmap (GtkWidget *widget)
-{
-  GtkPacker *packer;
-  GtkPackerChild *child;
-  GList *children;
-  
-  g_return_if_fail (GTK_IS_PACKER (widget));
-  
-  packer = GTK_PACKER (widget);
-  GTK_WIDGET_UNSET_FLAGS (packer, GTK_MAPPED);
-  
-  children = g_list_first(packer->children);
-  while (children) 
-    {
-      child = children->data;
-      children = g_list_next(children);
-      
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_unmap (child->widget);
-    }
-}
-
 static void 
 gtk_packer_size_request (GtkWidget      *widget,
                         GtkRequisition *requisition)
@@ -1262,7 +1187,7 @@ gtk_packer_size_allocate (GtkWidget      *widget,
  
         if (width <= 0 || height <= 0) 
          {
-            gtk_widget_unmap(child->widget);
+           gtk_widget_set_child_visible (child->widget, FALSE);
          } 
        else 
          {
@@ -1272,9 +1197,7 @@ gtk_packer_size_allocate (GtkWidget      *widget,
            child_allocation.height = height;
            gtk_widget_size_allocate (child->widget, &child_allocation);
            
-           if (GTK_WIDGET_MAPPED (widget) &&
-               !(GTK_WIDGET_MAPPED (child->widget)))
-             gtk_widget_map(child->widget); 
+           gtk_widget_set_child_visible (child->widget, TRUE);
          }
        
         list = g_list_next(list);
index 0f9d8afcce08d52b114471c74a01367c782b8f85..876fdf6fc35f8c5e9b2f1adda4bd0b310a5173b1 100644 (file)
@@ -44,8 +44,6 @@ static void    gtk_paned_get_property (GObject        *object,
                                       GValue         *value,
                                       GParamSpec     *pspec);
 static void    gtk_paned_realize      (GtkWidget      *widget);
-static void    gtk_paned_map          (GtkWidget      *widget);
-static void    gtk_paned_unmap        (GtkWidget      *widget);
 static void    gtk_paned_unrealize    (GtkWidget      *widget);
 static gint    gtk_paned_expose       (GtkWidget      *widget,
                                       GdkEventExpose *event);
@@ -104,8 +102,6 @@ gtk_paned_class_init (GtkPanedClass *class)
   object_class->get_property = gtk_paned_get_property;
 
   widget_class->realize = gtk_paned_realize;
-  widget_class->map = gtk_paned_map;
-  widget_class->unmap = gtk_paned_unmap;
   widget_class->unrealize = gtk_paned_unrealize;
   widget_class->expose_event = gtk_paned_expose;
   
@@ -271,38 +267,6 @@ gtk_paned_realize (GtkWidget *widget)
     gdk_window_show (paned->handle);
 }
 
-static void
-gtk_paned_map (GtkWidget *widget)
-{
-  GtkPaned *paned;
-
-  g_return_if_fail (GTK_IS_PANED (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  paned = GTK_PANED (widget);
-
-  if (paned->child1 &&
-      GTK_WIDGET_VISIBLE (paned->child1) &&
-      !GTK_WIDGET_MAPPED (paned->child1))
-    gtk_widget_map (paned->child1);
-  if (paned->child2 &&
-      GTK_WIDGET_VISIBLE (paned->child2) &&
-      !GTK_WIDGET_MAPPED (paned->child2))
-    gtk_widget_map (paned->child2);
-
-  gdk_window_show (widget->window);
-}
-
-static void
-gtk_paned_unmap (GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_PANED (widget));
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-
-  gdk_window_hide (widget->window);
-}
-
 static void
 gtk_paned_unrealize (GtkWidget *widget)
 {
@@ -381,17 +345,6 @@ gtk_paned_pack1 (GtkPaned  *paned,
       paned->child1_shrink = shrink;
 
       gtk_widget_set_parent (child, GTK_WIDGET (paned));
-
-      if (GTK_WIDGET_REALIZED (child->parent))
-       gtk_widget_realize (child);
-
-      if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-       {
-         if (GTK_WIDGET_MAPPED (child->parent))
-           gtk_widget_map (child);
-
-         gtk_widget_queue_resize (child);
-       }
     }
 }
 
@@ -411,17 +364,6 @@ gtk_paned_pack2 (GtkPaned  *paned,
       paned->child2_shrink = shrink;
 
       gtk_widget_set_parent (child, GTK_WIDGET (paned));
-
-      if (GTK_WIDGET_REALIZED (child->parent))
-       gtk_widget_realize (child);
-
-      if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-       {
-         if (GTK_WIDGET_MAPPED (child->parent))
-           gtk_widget_map (child);
-
-         gtk_widget_queue_resize (child);
-       }
     }
 }
 
index 3a9fdfa0eace853faf494dceda38ad1e1792df8d..f44f0c8ac8ed21556ea5211ba48165dfef4defc9 100644 (file)
@@ -217,20 +217,10 @@ _gtk_plug_add_to_socket (GtkPlug   *plug,
   plug->same_app = TRUE;
   socket->plug_widget = widget;
 
-  gtk_widget_set_parent (widget, GTK_WIDGET (socket));
-
   if (GTK_WIDGET_REALIZED (widget))
     gdk_window_reparent (widget->window, plug->socket_window, 0, 0);
-  else
-    gtk_widget_realize (widget);
 
-  if (GTK_WIDGET_VISIBLE (socket) && GTK_WIDGET_VISIBLE (widget))
-    {
-      if (GTK_WIDGET_MAPPED (socket))
-       gtk_widget_map (widget);
-
-      gtk_widget_queue_resize (widget);
-    }
+  gtk_widget_set_parent (widget, GTK_WIDGET (socket));
 
   g_signal_emit_by_name (G_OBJECT (socket), "plug_added", 0);
 }
index af9822c6746d300dcd0e300188aa3f60353db593..66943590c35e08e595dcf60a5f2c0b3d7bef1509 100644 (file)
@@ -49,7 +49,8 @@ typedef enum
   PRIVATE_GTK_IN_REPARENT       = 1 <<  6,
   PRIVATE_GTK_DIRECTION_SET     = 1 <<  7,   /* If the reading direction is not DIR_NONE */
   PRIVATE_GTK_DIRECTION_LTR     = 1 <<  8,   /* If the reading direction is DIR_LTR */
-  PRIVATE_GTK_ANCHORED          = 1 <<  9    /* If widget has a GtkWindow ancestor */
+  PRIVATE_GTK_ANCHORED          = 1 <<  9,   /* If widget has a GtkWindow ancestor */
+  PRIVATE_GTK_CHILD_VISIBLE     = 1 <<  10   /* If widget should be mapped when parent is mapped */
 } GtkPrivateFlags;
 
 /* Macros for extracting a widgets private_flags from GtkWidget.
@@ -64,6 +65,7 @@ typedef enum
 #define GTK_WIDGET_DIRECTION_SET(obj)    ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_DIRECTION_SET) != 0)
 #define GTK_WIDGET_DIRECTION_LTR(obj)     ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_DIRECTION_LTR) != 0)
 #define GTK_WIDGET_ANCHORED(obj)          ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_ANCHORED) != 0)
+#define GTK_WIDGET_CHILD_VISIBLE(obj)     ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_CHILD_VISIBLE) != 0)
 
 /* Macros for setting and clearing private widget flags.
  * we use a preprocessor string concatenation here for a clear
index 674ebc9bfd000e6467845ab60fc32bc93a0ad11c..561de3acb32801ecf4738a59fd0509e408fd42fd 100644 (file)
@@ -88,8 +88,6 @@ static void gtk_scrolled_window_get_arg                  (GtkObject              *object,
                                                    guint                   arg_id);
 static void gtk_scrolled_window_destroy            (GtkObject              *object);
 static void gtk_scrolled_window_finalize           (GObject                *object);
-static void gtk_scrolled_window_map                (GtkWidget              *widget);
-static void gtk_scrolled_window_unmap              (GtkWidget              *widget);
 static gint gtk_scrolled_window_expose             (GtkWidget              *widget,
                                                    GdkEventExpose         *event);
 static void gtk_scrolled_window_size_request       (GtkWidget              *widget,
@@ -158,8 +156,6 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
   object_class->get_arg = gtk_scrolled_window_get_arg;
   object_class->destroy = gtk_scrolled_window_destroy;
 
-  widget_class->map = gtk_scrolled_window_map;
-  widget_class->unmap = gtk_scrolled_window_unmap;
   widget_class->expose_event = gtk_scrolled_window_expose;
   widget_class->size_request = gtk_scrolled_window_size_request;
   widget_class->size_allocate = gtk_scrolled_window_size_allocate;
@@ -575,46 +571,6 @@ gtk_scrolled_window_finalize (GObject *object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
-static void
-gtk_scrolled_window_map (GtkWidget *widget)
-{
-  GtkScrolledWindow *scrolled_window;
-
-  g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
-
-  scrolled_window = GTK_SCROLLED_WINDOW (widget);
-
-  /* chain parent class handler to map self and child */
-  GTK_WIDGET_CLASS (parent_class)->map (widget);
-  
-  if (GTK_WIDGET_VISIBLE (scrolled_window->hscrollbar) &&
-      !GTK_WIDGET_MAPPED (scrolled_window->hscrollbar))
-    gtk_widget_map (scrolled_window->hscrollbar);
-  
-  if (GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar) &&
-      !GTK_WIDGET_MAPPED (scrolled_window->vscrollbar))
-    gtk_widget_map (scrolled_window->vscrollbar);
-}
-
-static void
-gtk_scrolled_window_unmap (GtkWidget *widget)
-{
-  GtkScrolledWindow *scrolled_window;
-
-  g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
-
-  scrolled_window = GTK_SCROLLED_WINDOW (widget);
-
-  /* chain parent class handler to unmap self and child */
-  GTK_WIDGET_CLASS (parent_class)->unmap (widget);
-  
-  if (GTK_WIDGET_MAPPED (scrolled_window->hscrollbar))
-    gtk_widget_unmap (scrolled_window->hscrollbar);
-  
-  if (GTK_WIDGET_MAPPED (scrolled_window->vscrollbar))
-    gtk_widget_unmap (scrolled_window->vscrollbar);
-}
-
 static void
 gtk_scrolled_window_paint (GtkWidget    *widget,
                           GdkRectangle *area)
@@ -1063,17 +1019,6 @@ gtk_scrolled_window_add (GtkContainer *container,
                                          gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar))))
     g_warning ("gtk_scrolled_window_add(): cannot add non scrollable widget "
               "use gtk_scrolled_window_add_with_viewport() instead");
-
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 static void
index 64c07fb362fe8826917daef57dcb91cd3a9f8128..e85f122d4a709c904db76ffef912cfebd9b98b01 100644 (file)
@@ -54,8 +54,6 @@ enum
 static void gtk_table_class_init    (GtkTableClass  *klass);
 static void gtk_table_init         (GtkTable       *table);
 static void gtk_table_finalize     (GObject        *object);
-static void gtk_table_map          (GtkWidget      *widget);
-static void gtk_table_unmap        (GtkWidget      *widget);
 static void gtk_table_size_request  (GtkWidget     *widget,
                                     GtkRequisition *requisition);
 static void gtk_table_size_allocate (GtkWidget     *widget,
@@ -141,8 +139,6 @@ gtk_table_class_init (GtkTableClass *class)
   gobject_class->get_property = gtk_table_get_property;
   gobject_class->set_property = gtk_table_set_property;
   
-  widget_class->map = gtk_table_map;
-  widget_class->unmap = gtk_table_unmap;
   widget_class->size_request = gtk_table_size_request;
   widget_class->size_allocate = gtk_table_size_allocate;
   
@@ -610,17 +606,6 @@ gtk_table_attach (GtkTable   *table,
   table->children = g_list_prepend (table->children, table_child);
   
   gtk_widget_set_parent (child, GTK_WIDGET (table));
-  
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
 }
 
 void
@@ -833,54 +818,6 @@ gtk_table_finalize (GObject *object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
-static void
-gtk_table_map (GtkWidget *widget)
-{
-  GtkTable *table;
-  GtkTableChild *child;
-  GList *children;
-  
-  g_return_if_fail (GTK_IS_TABLE (widget));
-  
-  table = GTK_TABLE (widget);
-  GTK_WIDGET_SET_FLAGS (table, GTK_MAPPED);
-  
-  children = table->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-      
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-}
-
-static void
-gtk_table_unmap (GtkWidget *widget)
-{
-  GtkTable *table;
-  GtkTableChild *child;
-  GList *children;
-  
-  g_return_if_fail (GTK_IS_TABLE (widget));
-  
-  table = GTK_TABLE (widget);
-  GTK_WIDGET_UNSET_FLAGS (table, GTK_MAPPED);
-  
-  children = table->children;
-  while (children)
-    {
-      child = children->data;
-      children = children->next;
-      
-      if (GTK_WIDGET_VISIBLE (child->widget) &&
-         GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_unmap (child->widget);
-    }
-}
-
 static void
 gtk_table_size_request (GtkWidget      *widget,
                        GtkRequisition *requisition)
index ce4a6493cfd426de3f90d4e371d0e9b79b23f77d..9b413bbe91ba70f59c22784faa8f575b896d2903 100644 (file)
@@ -319,17 +319,16 @@ struct _GtkTextViewChild
   gint y;
 };
 
-static GtkTextViewChild* text_view_child_new_anchored (GtkWidget          *child,
-                                                       GtkTextChildAnchor *anchor,
-                                                       GtkTextLayout      *layout);
-static GtkTextViewChild* text_view_child_new_window   (GtkWidget          *child,
-                                                       GtkTextWindowType   type,
-                                                       gint                x,
-                                                       gint                y);
-static void              text_view_child_free         (GtkTextViewChild   *child);
-
-static void              text_view_child_realize      (GtkTextView      *text_view,
-                                                       GtkTextViewChild *child);
+static GtkTextViewChild* text_view_child_new_anchored      (GtkWidget          *child,
+                                                           GtkTextChildAnchor *anchor,
+                                                           GtkTextLayout      *layout);
+static GtkTextViewChild* text_view_child_new_window        (GtkWidget          *child,
+                                                           GtkTextWindowType   type,
+                                                           gint                x,
+                                                           gint                y);
+static void              text_view_child_free              (GtkTextViewChild   *child);
+static void              text_view_child_set_parent_window (GtkTextView        *text_view,
+                                                           GtkTextViewChild   *child);
 
 struct _GtkTextWindow
 {
@@ -6233,8 +6232,8 @@ text_view_child_free (GtkTextViewChild *child)
 }
 
 static void
-text_view_child_realize (GtkTextView      *text_view,
-                         GtkTextViewChild *vc)
+text_view_child_set_parent_window (GtkTextView      *text_view,
+                                  GtkTextViewChild *vc)
 {
   if (vc->anchor)
     gtk_widget_set_parent_window (vc->widget,
@@ -6246,8 +6245,6 @@ text_view_child_realize (GtkTextView      *text_view,
                                          vc->type);
       gtk_widget_set_parent_window (vc->widget, window);
     }
-
-  gtk_widget_realize (vc->widget);
 }
 
 static void
@@ -6257,18 +6254,10 @@ add_child (GtkTextView      *text_view,
   text_view->children = g_slist_prepend (text_view->children,
                                          vc);
 
-  gtk_widget_set_parent (vc->widget, GTK_WIDGET (text_view));
-
   if (GTK_WIDGET_REALIZED (text_view))
-    text_view_child_realize (text_view, vc);
-
-  if (GTK_WIDGET_VISIBLE (text_view) && GTK_WIDGET_VISIBLE (vc->widget))
-    {
-      if (GTK_WIDGET_MAPPED (text_view))
-        gtk_widget_map (vc->widget);
-
-      gtk_widget_queue_resize (vc->widget);
-    }
+    text_view_child_set_parent_window (text_view, vc);
+  
+  gtk_widget_set_parent (vc->widget, GTK_WIDGET (text_view));
 }
 
 void
index 3d851ddd21124c6753afd93b21b35f234cf5ca0d..fd6a809c554b7f49b1e212737cf743f15b73dbf3 100644 (file)
@@ -81,8 +81,6 @@ static void gtk_toolbar_get_property             (GObject         *object,
                                                  GValue          *value,
                                                  GParamSpec      *pspec);
 static void gtk_toolbar_destroy                  (GtkObject       *object);
-static void gtk_toolbar_map                      (GtkWidget       *widget);
-static void gtk_toolbar_unmap                    (GtkWidget       *widget);
 static gint gtk_toolbar_expose                   (GtkWidget       *widget,
                                                  GdkEventExpose  *event);
 static void gtk_toolbar_size_request             (GtkWidget       *widget,
@@ -188,8 +186,6 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
   gobject_class->set_property = gtk_toolbar_set_property;
   gobject_class->get_property = gtk_toolbar_get_property;
 
-  widget_class->map = gtk_toolbar_map;
-  widget_class->unmap = gtk_toolbar_unmap;
   widget_class->expose_event = gtk_toolbar_expose;
   widget_class->size_request = gtk_toolbar_size_request;
   widget_class->size_allocate = gtk_toolbar_size_allocate;
@@ -472,50 +468,6 @@ gtk_toolbar_destroy (GtkObject *object)
   GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
-static void
-gtk_toolbar_map (GtkWidget *widget)
-{
-  GtkToolbar *toolbar;
-  GList *children;
-  GtkToolbarChild *child;
-
-  g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
-  toolbar = GTK_TOOLBAR (widget);
-  GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
-
-  for (children = toolbar->children; children; children = children->next)
-    {
-      child = children->data;
-
-      if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
-         && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_map (child->widget);
-    }
-}
-
-static void
-gtk_toolbar_unmap (GtkWidget *widget)
-{
-  GtkToolbar *toolbar;
-  GList *children;
-  GtkToolbarChild *child;
-
-  g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
-  toolbar = GTK_TOOLBAR (widget);
-  GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
-
-  for (children = toolbar->children; children; children = children->next)
-    {
-      child = children->data;
-
-      if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
-         && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
-       gtk_widget_unmap (child->widget);
-    }
-}
-
 static void
 gtk_toolbar_paint_space_line (GtkWidget       *widget,
                              GdkRectangle    *area,
@@ -1436,20 +1388,7 @@ gtk_toolbar_internal_insert_element (GtkToolbar          *toolbar,
   toolbar->num_children++;
 
   if (type != GTK_TOOLBAR_CHILD_SPACE)
-    {
-      gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
-
-      if (GTK_WIDGET_REALIZED (child->widget->parent))
-       gtk_widget_realize (child->widget);
-
-      if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
-       {
-         if (GTK_WIDGET_MAPPED (child->widget->parent))
-           gtk_widget_map (child->widget);
-
-         gtk_widget_queue_resize (child->widget);
-       }
-    }
+    gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
   else
     gtk_widget_queue_resize (GTK_WIDGET (toolbar));
 
index 1e369eaacb8c6f70e54086e158bad0189bd8ce4e..d3f605fa23b59c68008532f0073bc6bff139f818 100644 (file)
@@ -228,17 +228,6 @@ gtk_tree_insert (GtkTree   *tree,
     tree->children = g_list_insert (tree->children, tree_item, position);
   
   gtk_widget_set_parent (tree_item, GTK_WIDGET (tree));
-  
-  if (GTK_WIDGET_REALIZED (tree_item->parent))
-    gtk_widget_realize (tree_item);
-
-  if (GTK_WIDGET_VISIBLE (tree_item->parent) && GTK_WIDGET_VISIBLE (tree_item))
-    {
-      if (GTK_WIDGET_MAPPED (tree_item->parent))
-       gtk_widget_map (tree_item);
-
-      gtk_widget_queue_resize (tree_item);
-    }
 }
 
 static void
@@ -256,17 +245,6 @@ gtk_tree_add (GtkContainer *container,
   
   gtk_widget_set_parent (child, GTK_WIDGET (container));
   
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
-    {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
-
-      gtk_widget_queue_resize (child);
-    }
-  
   if (!tree->selection && (tree->selection_mode == GTK_SELECTION_BROWSE))
     gtk_tree_select_child (tree, child);
 }
index 523ba05aa9ee27bb27519b8f65b780361ab3e61b..20c13f6ebde0ee565c678a24cc00ac56cc6dd626 100644 (file)
@@ -312,17 +312,6 @@ gtk_tree_item_set_subtree (GtkTreeItem *tree_item,
     gtk_widget_hide (subtree);
 
   gtk_widget_set_parent (subtree, GTK_WIDGET (tree_item)->parent);
-
-  if (GTK_WIDGET_REALIZED (subtree->parent))
-    gtk_widget_realize (subtree);
-
-  if (GTK_WIDGET_VISIBLE (subtree->parent) && GTK_WIDGET_VISIBLE (subtree))
-    {
-      if (GTK_WIDGET_MAPPED (subtree->parent))
-       gtk_widget_map (subtree);
-
-      gtk_widget_queue_resize (subtree);
-    }
 }
 
 void
index fbfd31d83e19ae13d5ddaf8bb21685b48fa3dd8a..e3dcd6d07e9b4bd161fd2c4c25a14b2137dffa59 100644 (file)
@@ -499,9 +499,9 @@ gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column)
   gtk_widget_pop_composite_child ();
 
   /* make sure we own a reference to it as well. */
-  gtk_widget_set_parent (tree_column->button, GTK_WIDGET (tree_view));
   if (tree_view->priv->header_window)
     gtk_widget_set_parent_window (tree_column->button, tree_view->priv->header_window);
+  gtk_widget_set_parent (tree_column->button, GTK_WIDGET (tree_view));
   
   gtk_signal_connect (GTK_OBJECT (tree_column->button), "realize",
                      (GtkSignalFunc) gtk_tree_view_column_button_realize,
index 21726288d277680687db0fcd7ad51eeaf68621a9..9ac5b47d3054f12458593074c6b7401f04e95c1e 100644 (file)
@@ -50,8 +50,6 @@ static void gtk_viewport_get_property             (GObject         *object,
 static void gtk_viewport_set_scroll_adjustments          (GtkViewport      *viewport,
                                                   GtkAdjustment    *hadjustment,
                                                   GtkAdjustment    *vadjustment);
-static void gtk_viewport_map                      (GtkWidget        *widget);
-static void gtk_viewport_unmap                    (GtkWidget        *widget);
 static void gtk_viewport_realize                  (GtkWidget        *widget);
 static void gtk_viewport_unrealize                (GtkWidget        *widget);
 static void gtk_viewport_paint                    (GtkWidget        *widget,
@@ -116,8 +114,6 @@ gtk_viewport_class_init (GtkViewportClass *class)
   gobject_class->get_property = gtk_viewport_get_property;
   object_class->destroy = gtk_viewport_destroy;
   
-  widget_class->map = gtk_viewport_map;
-  widget_class->unmap = gtk_viewport_unmap;
   widget_class->realize = gtk_viewport_realize;
   widget_class->unrealize = gtk_viewport_unrealize;
   widget_class->expose_event = gtk_viewport_expose;
@@ -412,34 +408,6 @@ gtk_viewport_get_shadow_type (GtkViewport *viewport)
   return viewport->shadow_type;
 }
 
-static void
-gtk_viewport_map (GtkWidget *widget)
-{
-  GtkBin *bin;
-
-  g_return_if_fail (GTK_IS_VIEWPORT (widget));
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
-  bin = GTK_BIN (widget);
-
-  if (bin->child &&
-      GTK_WIDGET_VISIBLE (bin->child) &&
-      !GTK_WIDGET_MAPPED (bin->child))
-    gtk_widget_map (bin->child);
-
-  gdk_window_show (widget->window);
-}
-
-static void
-gtk_viewport_unmap (GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_VIEWPORT (widget));
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
-  
-  gdk_window_hide (widget->window);
-}
-
 static void
 gtk_viewport_realize (GtkWidget *widget)
 {
index 2c1f7094141c75392fff0ab282c7e6755a337700..d224d225cf48c796c59ed36b4c955377302061d1 100644 (file)
@@ -1290,7 +1290,7 @@ gtk_widget_init (GtkWidget *widget)
 {
   GdkColormap *colormap;
   
-  GTK_PRIVATE_FLAGS (widget) = 0;
+  GTK_PRIVATE_FLAGS (widget) = PRIVATE_GTK_CHILD_VISIBLE;
   widget->state = GTK_STATE_NORMAL;
   widget->saved_state = GTK_STATE_NORMAL;
   widget->name = NULL;
@@ -1606,6 +1606,12 @@ gtk_widget_unparent (GtkWidget *widget)
   if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
     gtk_widget_unrealize (widget);
 
+  /* Removing a widget from a container restores the child visible
+   * flag to the default state, so it doesn't affect the child
+   * in the next parent.
+   */
+  GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE);
+    
   old_parent = widget->parent;
   widget->parent = NULL;
   gtk_widget_set_parent_window (widget, NULL);
@@ -1722,6 +1728,7 @@ gtk_widget_real_show (GtkWidget *widget)
 
       if (widget->parent &&
          GTK_WIDGET_MAPPED (widget->parent) &&
+         GTK_WIDGET_CHILD_VISIBLE (widget) &&
          !GTK_WIDGET_MAPPED (widget))
        gtk_widget_map (widget);
     }
@@ -1879,7 +1886,8 @@ void
 gtk_widget_map (GtkWidget *widget)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (GTK_WIDGET_VISIBLE (widget) == TRUE);
+  g_return_if_fail (GTK_WIDGET_VISIBLE (widget));
+  g_return_if_fail (GTK_WIDGET_CHILD_VISIBLE (widget));
   
   if (!GTK_WIDGET_MAPPED (widget))
     {
@@ -3425,6 +3433,21 @@ gtk_widget_set_parent (GtkWidget *widget,
   if (GTK_WIDGET_ANCHORED (widget->parent))
     _gtk_widget_propagate_hierarchy_changed (widget, NULL);
   g_object_notify (G_OBJECT (widget), "parent");
+
+  /* Enforce realized/mapped invariants
+   */
+  if (GTK_WIDGET_REALIZED (widget->parent))
+    gtk_widget_realize (widget);
+
+  if (GTK_WIDGET_VISIBLE (widget->parent) &&
+      GTK_WIDGET_VISIBLE (widget))
+    {
+      if (GTK_WIDGET_CHILD_VISIBLE (widget) &&
+         GTK_WIDGET_MAPPED (widget->parent))
+       gtk_widget_map (widget);
+
+      gtk_widget_queue_resize (widget);
+    }
 }
 
 /**
@@ -4131,6 +4154,86 @@ gtk_widget_set_parent_window   (GtkWidget           *widget,
     }
 }
 
+
+/**
+ * gtk_widget_set_child_visible:
+ * @widget: a #GtkWidget
+ * @is_visible: if %TRUE, @widget should be mapped along with its parent.
+ *
+ * Sets whether @widget should be mapped along with its when its parent
+ * is mapped and @widget has been shown with gtk_widget_show(). 
+ *
+ * The child visibility can be set for widget before it is added to
+ * a container with gtk_widget_set_parent(), to avoid mapping
+ * children unnecessary before immediately unmapping them. However
+ * it will be reset to its default state of %TRUE when the widget
+ * is removed from a container.
+ * 
+ * Note that changing the child visibility of a widget does not
+ * queue a resize on the widget. Most of the time, the size of
+ * a widget is computed from all visible children, whether or
+ * not they are mapped. If this is not the case, the container
+ * can queue a resize itself.
+ *
+ * This function is only useful for container implementations and
+ * never should be called by an application.
+ **/
+void
+gtk_widget_set_child_visible (GtkWidget *widget,
+                             gboolean   is_visible)
+{
+  gboolean was_visible;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  was_visible = GTK_WIDGET_CHILD_VISIBLE (widget);
+  is_visible = is_visible != FALSE;
+
+  if (is_visible != was_visible)
+    {
+      if (is_visible)
+       {
+         GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE);
+
+         if (widget->parent &&
+             GTK_WIDGET_VISIBLE (widget->parent) &&
+             GTK_WIDGET_VISIBLE (widget))
+           {
+             if (GTK_WIDGET_MAPPED (widget->parent))
+               gtk_widget_map (widget);
+           }
+       }
+      else
+       {
+         GTK_PRIVATE_UNSET_FLAG (widget, GTK_CHILD_VISIBLE);
+         
+         if (GTK_WIDGET_MAPPED (widget))
+           gtk_widget_unmap (widget);
+       }
+    }
+}
+
+/**
+ * gtk_widget_get_child_visible:
+ * @widget: a #GtkWidget
+ * 
+ * Gets the value set with gtk_widget_set_child_visible().
+ * If you feel a need to use this function, your code probably
+ * needs reorganization. 
+ *
+ * This function is only useful for container implementations and
+ * never should be called by an application.
+ *
+ * Return value: %TRUE if the widget is mapped with the parent.
+ **/
+gboolean
+gtk_widget_get_child_visible (GtkWidget *widget)
+{
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  
+  return GTK_WIDGET_CHILD_VISIBLE (widget);
+}
+
 /*************************************************************
  * gtk_widget_get_parent_window:
  *     Get widget's parent window
@@ -5869,3 +5972,4 @@ gtk_widget_ref_accessible (AtkImplementor *implementor)
     g_object_ref (G_OBJECT (accessible));
   return accessible;
 }
+
index 03bae9dbbb8b21bc689710963e933f56860fde60..fcd48c1ad8c70e00ff3f2b09cfe6ab848ebef99c 100644 (file)
@@ -554,6 +554,10 @@ void          gtk_widget_set_parent          (GtkWidget           *widget,
                                           GtkWidget           *parent);
 void      gtk_widget_set_parent_window   (GtkWidget           *widget,
                                           GdkWindow           *parent_window);
+void       gtk_widget_set_child_visible   (GtkWidget           *widget,
+                                          gboolean             is_visible);
+gboolean   gtk_widget_get_child_visible   (GtkWidget           *widget);
+     
 GtkWidget *gtk_widget_get_parent          (GtkWidget           *widget);
 GdkWindow *gtk_widget_get_parent_window          (GtkWidget           *widget);
 gboolean   gtk_widget_child_focus         (GtkWidget           *widget,